#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <stdbool.h>
#include <stdint.h>

// 协议模块错误码
#define PROTOCOL_SUCCESS        0
#define PROTOCOL_ERROR_INIT     -1
#define PROTOCOL_ERROR_SEND     -2
#define PROTOCOL_ERROR_RECEIVE  -3
#define PROTOCOL_ERROR_PARSE    -4

// 命令类型定义
enum protocol_cmd_type {
    CMD_TYPE_VIDEO_START,
    CMD_TYPE_VIDEO_STOP,
    CMD_TYPE_CAMERA_CAPTURE,
    CMD_TYPE_DOWNLOAD_START,
    CMD_TYPE_DOWNLOAD_PAUSE,
    CMD_TYPE_DOWNLOAD_CANCEL,
    CMD_TYPE_OTA_CHECK,
    CMD_TYPE_OTA_START,
    CMD_TYPE_OTA_CANCEL,
    CMD_TYPE_GET_STATUS,
    CMD_TYPE_SET_CONFIG,
    CMD_TYPE_HEARTBEAT,
    CMD_TYPE_RESPONSE
};

// 响应状态
enum protocol_response_status {
    RESP_STATUS_SUCCESS,
    RESP_STATUS_FAILED,
    RESP_STATUS_BUSY,
    RESP_STATUS_INVALID
};

// 协议包头结构体
typedef struct {
    uint8_t sync_byte1;    // 同步字节1 (0xAA)
    uint8_t sync_byte2;    // 同步字节2 (0x55)
    uint16_t length;       // 数据包长度（包括头部和校验）
    uint8_t cmd_type;      // 命令类型
    uint8_t cmd_id;        // 命令ID
    uint16_t seq_num;      // 序列号
} protocol_header_t;

// 协议包体结构体
typedef struct {
    uint8_t *data;         // 数据指针
    uint16_t data_len;     // 数据长度
} protocol_payload_t;

// 完整协议包结构体
typedef struct {
    protocol_header_t header;
    protocol_payload_t payload;
    uint16_t checksum;     // 校验和
} protocol_packet_t;

// 状态信息结构体
typedef struct {
    bool is_video_recording;
    bool is_camera_available;
    int current_battery_level;
    float current_temperature;
    char firmware_version[32];
    uint32_t free_storage_bytes;
} drone_status_t;

/**
 * @brief 初始化协议模块
 * @return 成功返回PROTOCOL_SUCCESS，失败返回错误码
 */
int protocol_init(void);

/**
 * @brief 清理协议模块资源
 */
void protocol_cleanup(void);

/**
 * @brief 协议处理线程函数（用于主函数中创建线程）
 * @param arg 线程参数（未使用）
 * @return NULL
 */
void *protocol_thread_func(void *arg);

/**
 * @brief 发送协议包
 * @param packet 协议包指针
 * @return 成功返回PROTOCOL_SUCCESS，失败返回错误码
 */
int protocol_send_packet(protocol_packet_t *packet);

/**
 * @brief 发送响应包
 * @param cmd_id 命令ID
 * @param seq_num 序列号
 * @param status 响应状态
 * @param data 响应数据（可选）
 * @param data_len 响应数据长度
 * @return 成功返回PROTOCOL_SUCCESS，失败返回错误码
 */
int protocol_send_response(uint8_t cmd_id, uint16_t seq_num, 
                          enum protocol_response_status status,
                          uint8_t *data, uint16_t data_len);

/**
 * @brief 获取当前无人机状态
 * @param status 状态信息（输出参数）
 * @return 成功返回PROTOCOL_SUCCESS，失败返回错误码
 */
int protocol_get_drone_status(drone_status_t *status);

#endif /* PROTOCOL_H */